#ifndef IO_LIST_H
#define IO_LIST_H

struct io_list_el
{
	struct io_list_el *prev;
	struct io_list_el *next;
	void *data;
};

struct io_list
{
	int size;
	struct io_list_el *head;
	struct io_list_el *tail;
	int (*match)(const void *key1, const void *key2);
	void (*destroy)(void *data);
};

void io_list_init(struct io_list *list, void (*destroy)(void *data), int(*match)(const void *key1, const void *key2));
void io_list_destroy(struct io_list *list);
int io_list_ins_next(struct io_list *list, struct io_list_el *el, const void *data);
int io_list_ins_prev(struct io_list *list, struct io_list_el *el, const void *data);
int io_list_remove(struct io_list *list, struct io_list_el *el, void **data);
#define io_list_size(list) ((list)->size)
#define io_list_head(list) ((list)->head)
#define io_list_tail(list) ((list)->tail)
#define io_list_is_head(el) (NULL == (el)->prev ? 1 : 0)
#define io_list_is_tail(el) (NULL == (el)->next ? 1 : 0)
#define io_list_data(el) ((el)->data)
#define io_list_next(el) ((el)->next)
#define io_list_prev(el) ((el)->prev)

#endif
